//acwing

//https://www.acwing.com/problem/content/1499/

//树的遍历



//大小不一样,一样的话二叉树就不唯一了


#include<bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
const int N = 40;
#define INF 0x3f3f3f3f;
typedef long long int ll;
#define close(); std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
//----------------------------------------------------------------------------//
int postorder[N], inorder[N]; //后序遍历,中序遍历
unordered_map<int, int> l, r, pos; //存每个点左儿子,存每个点的右儿子,pos记录中序遍历每个点处在的位置
int build(int il, int ir, int pl, int pr) //中序左端点右端点,后序左端点右端点
{
    int root = postorder[pr]; //后序遍历最后一盒为根

    int k = pos[root]; //中序遍历根的下标

    if(il < k) l[root] = build(il, k - 1, pl, pl + k - 1 - il); //判断根的左子树在不在, pl + k - 1 - il是解方程的出(x-pl=(k-1)-il)
    if(ir > k) r[root] = build(k + 1, ir, pl + k - 1 - il + 1, pr - 1); //判断根的右子树在不在
    return root;
} 

void bfs(int root)//根节点开始宽搜
{
    queue<int> q;
    q.push(root);
    while(q.size())
    {
        auto t = q.front();
        q.pop();
        cout << t << " ";
        if(l.count(t)) q.push(l[t]);//先插左子树,层序遍历是先左子树的 
        if(r.count(t)) q.push(r[t]);
    }
}



int main()
{
    close();
    int n;
    cin >> n;
    for(int i = 0; i < n; i++) cin >> postorder[i];
    for(int i = 0; i < n; i++)
    {
        cin >> inorder[i];
        pos[inorder[i]] = i;
    }

    int root = build(0, n - 1, 0, n - 1);
    bfs(root);

    return 0;
}